83. 删除排序链表中的重复元素

83. 删除排序链表中的重复元素

Similar Question

leading to the advanced question

Solution Tips

方案一: 快慢指针

受到快慢指针原地删除的影响, 这题链表也使用了两个指针, 但是其实只需要一个指针就够了, 因为删除重复的元素, 只需要保留一个, slow 和 fast 永远是紧紧挨在一起的.

也可以理解为在链表中本身就包含了 node.next 这样一个指针, 所以只需要保留一个指针就 ok

但是快慢指针的方案, 可以灵活的处理保留 k 个重复数的场景

var deleteDuplicates = function(head) {
    if (head === null) return head;
    // 慢指针指向保留的元素, 快指针移动, 如果相同则删除
    // 如果不同则更新慢指针到快指针的位置
    // 需要保证 slow 总是在 fast 的前一个位置, 才能正确删除
    let slow = head;
    let fast = head.next;

    while (fast !== null) {
        if (slow.val === fast.val) {
            // 删除
            slow.next = fast.next; 
        }
        else {
            // 更新 slow
            slow = fast;
        }
        fast = fast.next;
    }

    return head;
};
var deleteDuplicates = function(head) {
    if (!head) {
        return head;
    }

    let cur = head;
    while (cur.next) {
        if (cur.val === cur.next.val) {
            cur.next = cur.next.next;
        } else {
            cur = cur.next;
        }
    }
    return head;
};